package xiancheng.dengdaitongzhi;

/**
 * 
 * @author Jin Jing
 * 
 * wait方法允许线程等待，悬挂起线程，释放锁
 * 
 * notifyAll唤醒所有的等待线程而notify只唤醒一个线程。notify是一种优化。
 *
 * wait()
 *
 * wait(long timeout)，等待时长为timeout，。等待结束后自动获取对象锁。
 * 被打断则抛出InterruptedException异常。
 * 
 * wait(long timeout, int nanos)，nanos是纳秒数
 * 
 * notifyAll()
 * 
 * notify()不能选择通知的哪一个线程，只有确知哪一个线程在何时等待什么时，才可用notify
 * 
 * 这些方法只能在同步方法中调用，并且用到所调用对象的对象锁。
 * 不在同步方法中就调用这些方法的话，将抛出java.lang.IllegalMonitorStateException异常
 * 
 */
public class Test{
	
	public synchronized void func1() {
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("func1");
	}
	public synchronized void func2() {
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("func2");
	}
	public synchronized void func3() {
		System.out.println("func3");
		notifyAll();
	}
	
	public static void main(String[] args) {
		Test test = new Test();

		Thread1 thread1 = new Thread1(test);
		thread1.start();
		Thread3 thread3 = new Thread3(test);
		thread3.start();
		Thread2 thread2 = new Thread2(test);
		thread2.start();

		
	}
}
